/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    using ll=long long;
    bool PreOrder(TreeNode *u,  ll mi, ll mx) //以当前节点为根节点的子树的最小值/最大值(根据左右节点判断)
    {
        if(u==nullptr) return true;
        if(!((mi<u->val)&&(u->val<mx))) return false;
        return InOrder(u->left, mi, u->val)&&InOrder(u->right, u->val, mx);
    }

    bool InOrder(TreeNode *u,  ll mi, ll mx) //以当前节点为根节点的子树的最小值/最大值(根据左右节点判断)
    {
        if(u==nullptr) return true;
        if(!InOrder(u->left, mi, u->val)) return false;
        if(!((mi<u->val)&&(u->val<mx))) return false;
        return InOrder(u->right, u->val, mx);
    }

    bool PostOrder(TreeNode *u,  ll mi, ll mx) //以当前节点为根节点的子树的最小值/最大值(根据左右节点判断)
    {
        if(u==nullptr) return true;
        if(!(InOrder(u->left, mi, u->val)&&InOrder(u->right, u->val, mx))) return false;
        if(!InOrder(u->left, mi, u->val)) return false;
        return (mi<u->val)&&(u->val<mx);
    }

    bool isValidBST(TreeNode* root) {
        if(root==nullptr) return true; //边界判断
        return InOrder(root, LLONG_MIN, LLONG_MAX);
    }
};